package com.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理模式通用版
//动态代理的好处
/*
* 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
* 公共也就就交给代理角色!实现了业务的分工!
* 公共业务发生扩展的时候，方便集中管理!
* 一个动态代理类代理的是一个接口，-般就是对应的一类业务
* 一个动态代理类可以代理多个类，只要是实现了同一个接口
* */
public class DongProxyUserServices implements InvocationHandler {
    //被代理对象
    private Object object;

    public void setObject(Object object) {
        this.object = object;
    }
   //生成代理实例
    public Object getProxy(){
      return  Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
    }
    //处理代理实例 并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质就是 使反射机制实现
        //在这个地方实现用户功能的扩展   ioc
        log(method.getName());
        Object invoke = method.invoke(object, args);
        //在这个地方实现用户功能的扩展   ioc
        return invoke;

    }
    public void log(String msg){
        System.out.println("日志动态代理："+msg+"执行完毕");
    }
}
